<?php
use Hoa\Registry\Registry;


/**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I('id',0); 获取id参数 自动判断get或者post
 * I('post.name','',['trim', 'htmlspecialchars']); 获取$_POST['name']
 * I('get.'); 获取$_GET
 * </code>
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @param array $filter 参数过滤方法
 * @return mixed
 */
function I($name, $default='', $filter=null) {
	$conf = Registry::get('conf');
	$defaultFilter = $conf['base']['input_filter'];
	static $_PUT	=	null;
	// 默认为自动判断
	$method =   'param';
	$var = $name;
	if (strpos($name,'.')) { // 指定参数来源
		list($method, $var) =   explode('.',$name,2);
	}
	switch(strtolower($method)) {
		case 'get'	 :
			$input =& $_GET;
			break;
		case 'post'	:
			$input =& $_POST;
			break;
		case 'put'	 :
			if (is_null($_PUT)){
				parse_str(file_get_contents('php://input'), $_PUT);
			}
			$input 	=	$_PUT;
			break;
		case 'param'   :
			switch($_SERVER['REQUEST_METHOD']) {
				case 'POST':
					$input  =  $_POST;
					break;
				case 'PUT':
					if (is_null($_PUT)){
						parse_str(file_get_contents('php://input'), $_PUT);
					}
					$input 	=	$_PUT;
					break;
				default:
					$input  =  $_GET;
			}
			break;
		case 'path'	:
			$input  =   array();
			if (!empty($_SERVER['PATH_INFO'])){
				$depr   =   '/';
				$input  =   explode($depr,trim($_SERVER['PATH_INFO'],$depr));
			}
			break;
		case 'request' :
			$input =& $_REQUEST;
			break;
		case 'session' :
			$input =& $_SESSION;
			break;
		case 'cookie'  :
			$input =& $_COOKIE;
			break;
		case 'server'  :
			$input =& $_SERVER;
			break;
		case 'globals' :
			$input =& $GLOBALS;
			break;
		default:
			return null;
	}
	if ('' == $var) { // 获取全部变量
		$data	   =   $input;
		$filters	=   !is_null($filter)? $filter : $defaultFilter;
		if ($filters) {
			foreach($filters as $filter) {
				$data   =   array_map_recursive($filter,$data); // 参数过滤
			}
		}
	} elseif (isset($input[$var])) { // 取值操作
		$data	   =   $input[$var];
		$filters	=   !is_null($filter)? $filter : $defaultFilter;
		if ($filters) {
			foreach ($filters as $filter) {
				if (function_exists($filter)) {
					$data   =   is_array($data) ? array_map_recursive($filter, $data) : $filter($data); // 参数过滤
				} else {
					$data   =   filter_var($data, is_int($filter) ? $filter : filter_id($filter));
					if (false === $data) {
						return   isset($default) ? $default : null;
					}
				}
			}
		}
	} else { // 变量默认值，这里实际上不是输入，而变成了定义变量
		$data	   =	isset($default)? $default : null;
	}
	return $data;
}



function array_map_recursive($filter, $data) {
	$result = array();
	foreach ($data as $key => $val) {
		$result[$key] = is_array($val)
		? array_map_recursive($filter, $val)
		: call_user_func($filter, $val);
	}
	return $result;
}